
;Adamed configuration program
;By Walid Maalouli
;July 2019

       org  100h

prnstr equ  9      ;print string fctn
conout equ  2      ;console out fctn
conin  equ  1      ;console in function
bdos   equ  5
filecb equ  5ch    ;file control block
dma    equ  80h    ;dma buffer
closef equ  10h    ;close file
delf   equ  13h    ;delete file
makef  equ  16h    ;make file
writef equ  15h    ;write sequential rec

start  call crlf
       call crlf
       mvi  c,prnstr   ;print frgnd menu
       lxi  d,forprt
       call bdos
       call crlf
       call crlf
       call colmen
redo   mvi  c,conin    ;get choice
       call bdos
       cpi  31h    ;check limits
       jp   cont2
fback  mvi  c,conout   ;backspace
       mvi  e,8
       call bdos
       jmp  redo
cont2  cpi  47h
       jp   fback
       call cnvnum ;convert to decimal
       sta  frgval ;save value
       call crlf
       call crlf
       mvi  c,prnstr   ;print bkgnd menu
       lxi  d,bakprt
       call bdos
       call crlf
       call crlf
       call colmen
redo1  mvi  c,conin    ;get choice
       call bdos
       cpi  31h    ;check limits
       jp   cont1
bback  mvi  c,conout   ;backspace
       mvi  e,8
       call bdos
       jmp  redo1
cont1  cpi  47h
       jp   bback
       call cnvnum ;convert to decimal
       sta  bakval ;save value
       call crlf
       call crlf
       mvi  c,prnstr   ;tab prompts
       lxi  d,tabprt
       call bdos
       call crlf
       call crlf
       mvi  c,prnstr
       lxi  d,pastab
       call bdos
       call crlf
       mvi  c,prnstr
       lxi  d,asmtab
       call bdos
       call crlf
       call crlf
       mvi  c,prnstr
       lxi  d,arrow
       call bdos
redo2  mvi  c,conin    ;get tab value
       call bdos
       cpi  31h
       jm   cortab
       cpi  33h
       jp   cortab
       sui  30h        ;convert to num
       sta  tabval
       jmp  savfil
cortab mvi  c,conout   ;print backspace
       mvi  e,8
       call bdos
       jmp  redo2
savfil call crlf
       call crlf
       mvi  c,prnstr   ;save/redo/exit?
       lxi  d,savprt
       call bdos
       call crlf
       mvi  c,prnstr
       lxi  d,redopr
       call bdos
       call crlf
       mvi  c,prnstr
       lxi  d,exitpr
       call bdos
       call crlf
       call crlf
       mvi  c,prnstr
       lxi  d,arrow
       call bdos
redo3  mvi  c,conin
       call bdos
       cpi  31h    ;check if entry valid
       jm   corval
       cpi  34h
       jp   corval
       jmp  proch
corval mvi  c,conout
       mvi  e,8
       call bdos
       jmp  redo3
proch  cpi  33h
       jz   exit
       cpi  32h
       jnz  save
       jmp  start
exit   jmp  0
save   mvi  h,11   ;length of filename
       lxi  b,filecb+1
       lxi  d,filnam
redo4  ldax d      ;put filename in fcb
       stax b
       inx  d
       inx  b
       dcr  h
       jnz  redo4
       mvi  c,delf ;delete file if exits
       lxi  d,filecb
       call bdos
       mvi  c,makef    ;create new file
       lxi  d,filecb
       call bdos
       cpi  0ffh   ;check if dir full
       jnz  dirok
       call crlf
       call crlf
       mvi  c,prnstr   ;print err mess
       lxi  d,dirful
       call bdos
       jmp  savfil
dirok  lda  frgval ;place data in dma
       sta  dma
       lda  bakval
       sta  dma+1
       lda  tabval
       sta  dma+2
       mvi  c,writef   ;write data
       lxi  d,filecb
       call bdos
       cpi  0      ;check if successful
       jnz  filerr
       mvi  c,closef   ;close file
       lxi  d,filecb
       call bdos
       call crlf
       call crlf
       mvi  c,prnstr   ;print message
       lxi  d,sucmes
       call bdos
       jmp  savfil
filerr call crlf
       call crlf
       mvi  c,prnstr   ;print err mess
       lxi  d,errmes
       call bdos
       mvi  c,closef
       lxi  d,filecb
       call bdos
       jmp  savfil

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;subroutines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;display color choices
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
colmen mvi  a,15   ;number of colors
       sta  tmpstr
       lxi  d,colors ;point to colr list
       push d
cont   mvi  c,prnstr
       call bdos
       call crlf
       pop  h
       lxi  d,18   ;point to next color
       dad  d
       xchg
       push d
       lda  tmpstr ;are we at end?
       dcr  a
       sta  tmpstr
       jnz  cont
       pop  d
       call crlf
       mvi  c,prnstr   ;print arrow
       lxi  d,arrow
       call bdos
       ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;display cr/lf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
crlf   mvi  c,conout
       mvi  e,0ah
       call bdos
       mvi  c,conout
       mvi  e,0dh
       call bdos
       ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;convert hex to decimal
;A has the asci hex
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cnvnum cpi  40h    ;number <10?
       jp   letter
       sui  30h    ;convert to decimal
       ret
letter sui  37h    ;convert to decimal
       ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tmpstr ds   1      ;temp byte storage
frgval ds   1      ;foreground value
bakval ds   1      ;background value
tabval ds   1      ;tab value

forprt db   'Foreground color?$'
bakprt db   'Background color?$'
colors db   '1 - black        $'
       db   '2 - medium green $'
       db   '3 - light green  $'
       db   '4 - dark blue    $'
       db   '5 - light blue   $'
       db   '6 - dark red     $'
       db   '7 - cyan         $'
       db   '8 - medium red   $'
       db   '9 - light red    $'
       db   'A - dark yellow  $'
       db   'B - light yellow $'
       db   'C - dark green   $'
       db   'D - magenta      $'
       db   'E - gray         $'
       db   'F - white        $'
arrow  db   '--> $'
tabprt db   'Select TAB choice:$'
pastab db   '1- Pascal$'
asmtab db   '2- Assembly$'
savprt db   '1- Save configuration$'
redopr db   '2- Modify configuration$'
exitpr db   '3- Exit to CP/M$'
filnam db   'ADAMED  CFG'
sucmes db   'Write successful!$'
errmes db   'Target drive full!$'
dirful db   'Directory full!$'

       end
